package com.redstar.HappyRefresh.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.redstar.HappyRefresh.audit.ImageAuditService;
import com.redstar.HappyRefresh.audit.TextAuditService;
import com.redstar.HappyRefresh.cache.UserInfo;
import com.redstar.HappyRefresh.config.QiNiuConfig;
import com.redstar.HappyRefresh.pojo.*;
import com.redstar.HappyRefresh.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/luckyjourney/customer")
public class UserController { // 用户
    @Autowired
    private UserService userService;
    @Autowired
    private FavoritesService favoritesService;
    @Autowired
    private QiNiuConfig qiNiuConfig;

    @GetMapping("/getInfo/{userId}")
    public Result getInfo(@PathVariable Long userId) { // 根据用户id获取用户信息
        if (ObjectUtils.isEmpty(userId)) {
            log.error("getInfo方法：用户id为null");
            return Result.fail().message("用户id为null");
        }
        UserVO userVO = userService.getInfo(userId);
        if (ObjectUtils.isEmpty(userVO)) {
            log.error("getInfo方法：查询结果为空");
            return Result.fail().message("查询结果为空");
        }
        return Result.succeed().data(userVO);
    }

    @GetMapping("/getInfo")
    public Result getDefaultInfo() { // 获取当前用户信息、
        Long userId = UserInfo.get();
        UserVO userVO = userService.getInfo(userId);
        if (ObjectUtils.isEmpty(userVO)) {
            log.error("getDefaultInfo方法：查询结果为空");
            return Result.fail().message("查询结果为空");
        }
        return Result.succeed().data(userVO);
    }

    @GetMapping("/follows")
    public Result getFollows(BasePage basePage, @RequestParam Long userId) { // 查询指定用户的关注列表，分页数据
        if (ObjectUtils.isEmpty(userId)) {
            log.error("getFollows方法：用户id为null");
            return Result.fail().message("用户id为null");
        }
        return Result.succeed().data(userService.getFollows(basePage, userId));
    }

    @GetMapping("/fans")
    public Result getFans(BasePage basePage, @RequestParam Long userId) { // 查询指定用户的粉丝列表，分页数据
        if (ObjectUtils.isEmpty(userId)) {
            log.error("getFans方法：用户id为null");
            return Result.fail().message("用户id为null");
        }
        return Result.succeed().data(userService.getFans(basePage, userId));
    }

    @GetMapping("/favorites")
    public Result listFavorites() { //  获取当前用户的收藏夹
        Long userId = UserInfo.get();
        return Result.succeed().data(favoritesService.getByUserId(userId));
    }

    @GetMapping("/favorites/{id}")
    public Result getFavorites(@PathVariable Long id) { // 获取指定收藏夹
        if (ObjectUtils.isEmpty(id)) {
            log.error("getFavorites方法：收藏夹id为null");
            return Result.fail().message("收藏夹id为null");
        }
        return Result.succeed().data(favoritesService.getById(id));
    }

    @PostMapping("/favorites")
    public Result saveOrUpdateFavorites(@RequestBody @Validated Favorites favorites) { // 添加或修改收藏夹
        if (ObjectUtils.isEmpty(favorites)) {
            log.error("saveOrUpdateFavorites方法：收藏夹为null");
            return Result.fail().message("收藏夹为null");
        }
        String message = userService.saveOrUpdateFavorites(favorites);
        if ("false".equals(message)) {
            log.error("saveOrUpdateFavorites方法：收藏夹存在且未修改");
            return Result.fail().message("收藏夹存在且未修改");
        } else{
            return Result.succeed().message(message);
        }
    }

    @DeleteMapping("/favorites/{id}")
    public Result deleteFavorites(@PathVariable Long id) { // 删除当前用户的收藏夹和收藏视频表中的视频
        if (ObjectUtils.isEmpty(id)) {
            log.error("deleteFavorites方法：收藏夹id为空");
            return Result.fail().message("收藏夹id为空");
        }
        String message = favoritesService.removeFavoritesAndFavoritesVideo(id);
        if ("success".equals(message)) {
            return Result.succeed().message("收藏夹删除成功");
        } else {
            log.error(message);
            return Result.fail().message(message);
        }
    }

    @PostMapping("/subscribe")
    public Result subscribe(@RequestParam String types) { // 订阅分类
        if (!StringUtils.hasLength(types)) {
            log.error("subscribe方法：分类为null，这让我怎么订阅！");
            return Result.fail().message("分类为null，这让我怎么订阅！");
        }
        // types是以逗号分隔的分类id
        String message = userService.subscribe(types);
        if ("success".equals(message)) {
            return Result.succeed().message("订阅成功");
        } else{
            log.error(message);
            return Result.fail().message(message);
        }
    }

    @GetMapping("/subscribe")
    public Result listSubscribeType() { // 获取用户订阅的分类
        Long userId = UserInfo.get();
        List<Type> types = userService.listSubscribeType(userId);
        if (types.isEmpty()) {
            log.info("listSubscribeType方法：这个用户竟然什么分类都没订阅！！");
        }
        return Result.succeed().data(types);
    }

    @GetMapping("/noSubscribe")
    public Result listNoSubscribeType() { // 获取用户未订阅的分类
        Long userId = UserInfo.get();
        return Result.succeed().data(userService.listNoSubscribeType(userId));
    }

    @PostMapping("/follows")
    public Result followUser(@RequestParam Long followsUserId) { // 关注/取关
        if (followsUserId == null) {
            log.error("followUser方法：followsUserId为null，这让我怎么操作！");
            return Result.fail().message("followsUserId为null，这让我怎么操作！");
        }
        String message = userService.followUser(followsUserId);
        if ("false".equals(message)) {
            log.error("followUser方法：不能自己关注自己");
            return Result.fail().message("不能自己关注自己");
        } else {
            return Result.succeed().message(message);
        }
    }

    @PostMapping("/updateUserModel")
    public Result updateUserModel(@RequestBody Model model) { // 根据用户浏览时长修改用户模型
        Double score = model.getScore();
        if (score != 1.0 && score != -0.5) { // 概率只能是1或-0.5
            log.error("updateUserModel方法：你小子传过来的概率怎么不对");
            return Result.fail().message("你小子传过来的概率怎么不对");
        }
        userService.updateUserModel(model);
        return Result.succeed();
    }

    @GetMapping("/avatar/token")
    public Result avatarToken() { // 获取用户上传头像的token
        return Result.succeed().data(qiNiuConfig.imageUploadToken());
    }

    @PutMapping
    public Result updateUser(@RequestBody @Validated UpdateUserVO user) { // 修改用户信息
        String message = userService.updateUser(user);
        if ("success".equals(message)) {
            return Result.succeed();
        } else {
            return Result.fail().message(message);
        }
    }
}
